<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://203.162.17.98/weblh/suutam/2002/vovisoft/msnet/4.htm -->
<HTML><HEAD><TITLE>Bài 4</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="Le Hoan" name=Author>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="computer, software, games, vietnam, viet nam, tin hoc, le hoan, pclehoan, ktlehoan, vietnamese, download, saigon, freeware, lehoanpc, mailing list, may tinh, phan cung, phan mem, kien thuc, hop thu, internet, weblh, unicode, Forum, chat, diendan, dien dan" 
name=keywords>
<META 
content="Pho bien kien thuc, huong dan su dung phan cung, phan mem may tinh, game. Download software free. Link website Vietnam, forum, chat, mailing list..." 
name=description></HEAD>
<BODY>
<CENTER>
<P><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="4_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma></P>
<H2><FONT face=Tahoma color=#800000>Bài 4</FONT></H2>
<H2><FONT face=Tahoma color=#800000>Những chức năng Đối Tượng mới của VB.NET 
(phần I)</FONT></H2></CENTER></FONT><FONT face=Arial>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <P align=justify><FONT color=green size=2>V</FONT><FONT size=2> B.NET khắc 
    phục những giới hạn về <B>Đối Tượng (Object-Oriented)</B> của VB6 và mang 
    đến cho ta một ngôn ngữ lập trình hoàn toàn Object-Oriented (OO). Gần như 
    mọi thứ trong VB.NET đều liên hệ với Object. Nếu bạn còn mới với lập trình 
    theo hướng đối tượng (Object Oriented Programming) thì phần giải thích sau 
    đây sẽ giúp bạn làm quen với nó. </FONT></P>
    <H3 align=justify><FONT color=green size=2>Classes và Objects, nguyên tắc 
    Abstraction</FONT></H3>
    <P align=justify><FONT size=2>Theo phương pháp đối tượng, program được thiết 
    kế để một phần code đại diện cho một vật tương đương ngoài đời. Nó được gọi 
    là <B>Class</B>.<BR><BR>Khi lập trình VB6 ta đã dùng những controls từ 
    Toolbox như Textbox, Label, Listbox ..v.v.. <B>Textbox</B> là Class của các 
    Objects <B>Text1, Text2</B>. Cũng như <B>Label1, Label2</B> là những Objects 
    tạo ra từ Class <B>Label</B>. Ta hay dùng hai từ <FONT 
    color=blue><B>Class</B></FONT> và <FONT color=blue><B>Object</B></FONT> lẫn 
    lộn nhau. Điều đó không quan trọng, miễn là ta biết rằng Class là một ý niệm 
    <FONT color=blue><B>Trừu tượng (Abstraction</B></FONT>), còn Object là một 
    vật thực hữu. Giống như <B>Class CaSĩ</B> là một ý niệm trừu tượng, còn 
    <B>Object KhánhHà</B> của Class CaSĩ là một người bằng da, bằng thịt với 
    tiếng hát được nhiều người ngưỡng mộ.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=304 
      src="4_files/Abstraction.gif" width=456></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Ta nói Object là một <B>Instance</B> của 
    Class, và ta <B>instantiate</B> Class để có một Object.<BR><BR>Thường thường 
    khi ta phân tích một vấn đề để thiết kế chương trình thì các <B>Danh từ 
    (Nouns)</B> là những Classes. Giả dụ ta phân tích hoạt động của một Nhà Kho 
    (warehouse). Ta có phòng chứa, ngăn tủ, bãi nhận hàng, xe nâng hàng, nhân 
    viên ..v.v., mỗi thứ đều có thể là một Object nên ta sẽ thiết kế một Class 
    cho nó.</FONT></P>
    <H3 align=justify><FONT color=green size=2>Fields, Properties, Methods và 
    Events, nguyên tắc Encapsulation</FONT></H3>
    <P align=justify><FONT size=2>Class CaSĩ diễn tả CaSĩ là người như thế nào. 
    Như <B>SốBàiHát</B> là một Public Variable của Class, được gọi là 
    <B>Field</B> có thể được đọc/viết trực tiếp. Còn <B>Kiểu tóc</B> (dài, ngắn, 
    màu đen, có sọc nâu ...), <B>Giọng hát</B> (cao, trầm, ..). là những 
    <B>Properties</B>. Chúng cũng giống như Field nhưng được implemented (thi 
    hành) bằng cách dùng procedures <B>Property Get</B> và <B>Property Set</B>. 
    Property Set có thể được coded để kiểm soát nếu "Kiểu tóc" không thích hợp 
    thì sẽ bị loại bỏ. Ngược lại, nếu "Kiểu tóc" thích hợp và được áp dụng thì 
    ta sẽ thấy kết quả ngay là CaSĩ lại đẹp thêm ra. Thường thường Fields và 
    Properties là các <B>Danh từ (Nouns)</B>.<BR><BR>Một CaSĩ có khả năng 
    <B>ĐơnCa</B>, <B>KýTênLưuNiệm</B>, <B>TrìnhDiễn</B>. Ta gọi đó là những 
    <B>Methods</B> mà ta implemented bằng <B>Subs</B> và <B>Functions</B> (thí 
    dụ như <B>Function KýTênLưuNiệm</B> sẽ return một chữ ký). Thường thường 
    Methods là những <B>Động từ (Verbs)</B><BR><BR>Đối với code bên trong Class 
    thì Property giống như một Method còn đối với <B>Client</B> (tức là program 
    đang dùng Class) thì Property giống như Field.<BR><BR>Đôi khi, nếu trình 
    diễn lâu, CaSĩ cần một ly nước. CaSĩ sẽ Raise <B>Event KhátNước</B> để nhân 
    viên trong hậu trường phục vụ.<BR><BR>Ta gọi chung Fields, Properties, 
    Methods và Events là những <B>Class Members (Các Thành viên của 
    Class)</B><BR><BR>Có một ngoại lệ về sự khác biệt giữ Class và Member, đó là 
    khi ta dùng các <B>Shared Class Members</B> của một Class thì ta không nhất 
    thiết phải instantiate một Object. Ta có thể dùng thẳng tên của Class như 
    một Object.<BR><BR>Cái lợi điểm của Object Oriented Programming là ta có thể 
    gói tất cả những đặc điểm, khả năng của một Class vào trong một <B>Unit of 
    Code</B> (Đơn vị mã) tự túc. Khi chúng ta lịch sự yêu cầu thì CaSĩ 
    <B>ĐơnCa</B>. Ta biết CaSĩ ca thì thu hút lòng người, nhưng ta không cần 
    biết làm sao CaSĩ đạt đến trình độ như vậy. Đó không phải là chuyện để chúng 
    ta quan tâm. <BR><BR>Đối với ta Class CaSĩ là một <B>Black Box</B>, ta không 
    biết và không cần biết chuyện gì xãy ra bên trong. Nếu sau nầy CaSĩ thay đổi 
    kỹ thuật đơn ca để hát dễ và hay hơn, điều đó không ảnh hưởng gì đến chúng 
    ta. Đặc tính OO ấy gọi là <B><FONT color=blue>Encapsulation (Gói 
    kín)</FONT></B>.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=496 src="4_files/Encap.gif" 
      width=328></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Cách ta lập trình với Class chỉ khác cách ta 
    lập trình trước đây một chút thôi. Nếu trước đây ta phải tự làm, thì bây giờ 
    ta instantiate một Object của Class chuyên trị những chuyện ta muốn làm, rồi 
    bảo nó làm cho ta. So với ngoài đời, thí dụ bạn có mở một tiệm photocopy. 
    Sau một năm bạn tự trông coi, công chuyện làm ăn ổn định và có kết quả tốt. 
    Bạn muốn mở thêm một tiệm photocopy nữa ở chỗ khác. Trước khi đi lo chỗ khác 
    bạn huấn luyện nghề photocopy cho một người làm công trung thành, rồi giao 
    cho người ấy làm quản lý để thay thế bạn. Người đó là môt Object của 
    <B>Class QuảnLýTiệmPhotoCopy</B>.<BR><BR>Trở lại cách lập trình, những công 
    việc bạn làm hằng ngày trong tiệm photocopy là những <B>Methods</B>. Tất cả 
    đồ đạc, sổ sách của tiệm là những <B>Properties</B>. Bạn đã sắp đặt mỗi tuần 
    phải gọi người lại quét dọn tiệm, mỗi tháng phải bảo trì các máy 
    photocopiers, đó là những <B>Events</B>. Bây giờ bạn gói tất cả những thứ ấy 
    lại thành <B>Class QuảnLýTiệmPhotoCopy</B>. Lần đầu bạn instantiate Class 
    QuảnLýTiệmPhotoCopy làm thành <B>ChúTưThông</B>, người sẽ thay thế bạn làm 
    quản lý tiệm photocopy đầu tiên. Khi bạn muốn mở thêm tiệm thứ ba, bạn sẽ 
    instantiate Class QuảnLýTiệmPhotoCopy một lân nữa làm thành 
    <B>DìSáuHương</B> , người sẽ thay thế bạn làm quản lý tiệm photocopy thứ 
    nhì.<BR><BR>Khi đã phân chia trách nhiệm các phần code thành những Class, 
    bạn có thể tập trung tư tưởng vào từng Class một, không cần phải cố nhớ mọi 
    thứ trong đầu khi giải quyết chuyện gì. Vì code của Class nào chỉ làm việc 
    và ảnh hưởng trong phạm vi hoạt động của nó, không đụng chạm đến ai khác. 
    Nếu có gì trục trặc, thường thường ta có thể xác định đó là lỗi của Class 
    nào tương đối dễ dàng.<BR><BR>Có một câu hỏi đùa rằng theo phương pháp OO 
    thì: "Thay một bóng đèn cần bao nhiêu programmers?". Đáp: "Không cần 
    programmer nào hết, bạn bảo đèn tự thay bóng của nó." (Lời đáp khác: "Không 
    cần programmer nào hết, Microsoft đã đổi tiêu chuẩn ra bóng đêm.")<BR><BR>Do 
    đó, nếu trước kia bạn lập trình để tự mình lo liệu công chuyện thì bây giờ 
    hãy giao cho các Objects tự lo cho chúng. Tức là trước đây, nếu bạn là chủ 
    điền mỗi năm bạn phải đi góp lúa ruộng, thì bây giờ bạn bảo các tá điền phải 
    tự đem nộp lúa vào trong kho cho bạn. Sướng không? Chỉ ở trong thế giới lập 
    trình OO, ta mới có thể mơ mộng như vậy.</FONT></P>
    <H3 align=justify><FONT color=green size=2>Inheritance (Thừa Kế)</FONT></H3>
    <P align=justify><FONT size=2>Nguyên tắc Encapsulation nói trên cho phép ta 
    dùng nhiều Objects của một hay nhiều Classes một cách an toàn, tức là không 
    sợ Methods của các Objects giẫm chân lên nhau.<BR><BR>Giả sử ta muốn dùng 
    lại một Class để làm một Class mới, đặc biệt hơn, thí dụ như ta muốn làm nên 
    một <B>Class CaSĩ</B> từ <B>Class NghệSĩ</B>. Cách làm ấy gọi là <FONT 
    color=blue><B>Inheritance (Thừa kế)</B></FONT>. Công việc thừa kế nầy được 
    thực hiện qua một quá trình gọi là <B>Subclassing</B>.<BR><BR>Ở đây ta dùng 
    lại Class NghệSĩ mà hoàn toàn không đụng đến <B>Source Code (Nguồn Mã)</B> 
    của Class NghệSĩ. Nguyên tắc ấy gọi là <B>Reusability (Dùng lại)</B>. Lưu ý 
    là nếu ta dùng lại Source code mà có sửa đổi một chút trong Source Code thì 
    không thể gọi là Reuse được vì có thể việc sửa đổi Source Code đó sẽ gây ra 
    bugs mới. Ta phải chỉ cần Inherit từ Object Code của một Class cũng được thì 
    mới thật sự là Reuse.<BR><BR>Ta dùng Inheritance để cho thêm các Class 
    Members, tức là thêm đặc tính và chức năng. Thí dụ NghệSĩ thì có <B>Property 
    TâmHồn</B> (NhạyCảm (Sentitive) , ThơMộng (Romantic),...), và <B>Methods 
    KýTênLưuNiệm, TrìnhDiễn</B>. Class CaSĩ sẽ giữ y các đặc tính và chức năng 
    ấy và thêm <B>Sub ĐơnCa</B>, <B>Function HátNhạcYêuCầu</B>, 
    .v.v..<BR><BR>Tương tự như vậy, ta cũng có thể thừa kế từ Class NghệSĩ để 
    tạo ra <B>Class HọaSĩ</B>. Class HọaSĩ sẽ giữ y các đặc tính và chức năng 
    của Class NghệSĩ nhưng thêm <B>Function VẽChânDung</B>, <B>Sub 
    TrangTrí</B>.<BR><BR>Trong thí dụ nói trên, người ta gọi Class NghệSĩ là 
    <B>Parent Class, Super Class</B> hay <B>Base Class</B>. Còn Class CaSĩ và 
    Class HọaSĩ được gọi là <B>Child Class</B> hay <B>SubClass</B>.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=592 
      src="4_files/Inheritance.gif" width=624></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Nếu ta lại Inherit Class CaSĩ để tạo ra 
    <B>Class CaSĩTânNhạc</B> và <B>Class CaSĩCổNhạc</B> thì trong trường hợp nầy 
    CaSĩ là Parent Class và CaSĩTânNhạc với CaSĩCổNhạc là Child 
    Classes.<BR><BR>Mỗi Casĩ <B>là</B> một NghệSĩ nên ta có mối liên hệ "<B>IS 
    (Là)</B>" giữa hai classes nầy. Nó khác với mối liên hệ "<B>HAS (Có)</B>". 
    Thí dụ nếu trong Class CaSĩ <B>có</B> một Object thuộc <B>Class ĐầuBếp</B>, 
    thì một CaSĩ có thể cho ta một bữa ăn ngon nhưng không hẳn cho chính CaSĩ 
    nấu. Nó giống như ngoài đời CaSĩ KhánhHà mướn một đầu bếp để đãi khách. Ta 
    sẽ nói Class CaSĩ có mối liên hệ <B>HAS (Có)</B> với Class ĐầuBếp trong 
    trường hợp nầy, chớ không phải Class CaSĩ <B>IS (Là)</B> một Class 
    ĐầuBếp.<BR><BR>Trong .NET ta chỉ có <B>Single (Đơn) Inheritance</B>, tức là 
    một Class không thể Inherit từ hai hay ba Classes khác. Giống như nói Con 
    thừa kế từ Cha và Cha thừa kế từ ÔngNội, không có nhắc gì đến Mẹ hay BàNội. 
    Một Child Class chỉ có một Parent Class, ngược lại, một Parent Class có thể 
    có nhiều Child Classes.</FONT></P>
    <H3 align=justify><FONT color=green size=2>Polymorphism (Đa 
dạng)</FONT></H3>
    <P align=justify><FONT color=blue><B><FONT 
    size=2>Polymorphism</FONT></B></FONT><FONT size=2> là khả năng dùng Class 
    Members trùng tên của Objects thuộc về các Classes khác nhau. Thí dụ Objects 
    <B>KháchHàng</B> và <B>NhânViên</B> đều có <B>Property Name</B>. Nếu ta có 
    thể lập trình để dùng Name mà không cần nói rõ nó thuộc về Object KháchHàng 
    hay NhânViên thì đó là Polymorphism.<BR><BR>Polymorphism thể hiện dưới nhiều 
    hình thức:<BR></FONT></P>
    <OL>
      <LI>
      <P align=justify><B><FONT size=2>Late Binding (Hiệu lực 
      trể)</FONT></B><FONT size=2>: Có nghĩa là đợi đến giờ chót, khi execution, 
      thì code mới biết nó đang làm việc với loại Object nào. Chữ binding nói 
      đến "hiệu lực", late binding là có hiệu lực trể. Điều nầy được thực hiện 
      bằng cách hứa hẹn một Object thuộc Parent Class để trong lúc runtime ta có 
      thể giao cho code một Object thuộc Child Class. Thí dụ ta hứa với khán giả 
      sẽ có một CaSĩ trình diễn, lúc mở màn ta có thể cung cấp một CaSĩTânNhạc 
      hay một CaSĩCổNhạc.</FONT></P>
      <BLOCKQUOTE>
        <P align=justify><FONT size=2><IMG height=336 
        src="4_files/LateBinding.gif" width=576></FONT></P></BLOCKQUOTE>
      <LI>
      <P align=justify><B><FONT size=2>Overloading (Quá tải, đã có rồi mà còn 
      cho thêm) </FONT></B><FONT size=2>: Overloading cho phép ta viết trong 
      cùng một Class nhiều versions khác nhau của Property hay Method. Chúng 
      được phân biệt nhờ dùng parameters khác data type hay con số parameters 
      khác nhau. Thí dụ một version của Sub được passed cho một Integer 
      Parameter, một version khác được passed cho một String Parameter, một 
      version khác lại được passed cho hai parameters. Khi ta gọi một Method của 
      Class, nó sẽ dựa vào data type của parameters ta pass và số parameters ta 
      pass để execute đúng version của Method.<BR><BR>Một thí dụ về Overloading 
      ngoài đời là khi ta yêu cầu CaSĩ đơn ca ta được phép đề nghị CaSĩ hát theo 
      Karaoke, hay được Ban Nhạc Sống phụ họa, hay thêm cả một nhóm ca sĩ khác 
      phụ họa .v.v..<BR></FONT></P>
      <LI>
      <P align=justify><B><FONT size=2>Overriding (Lấn quyền) </FONT></B><FONT 
      size=2>: Overriding áp dụng cho Child Class đối với Parent Class. Trong 
      Child Class ta cung cấp một Method cùng tên, cùng số parameters và cùng 
      parameter data type với một Method trong Parent Class (ở đây không nhất 
      thiết phải là Cha, có thể là ÔngNội hay nhiều đời trước) để dùng nó thay 
      thế cho Parent Class Method. Ta nói Child Class thay đổi behaviour (tánh 
      tình, cách xử sự) của Parent Class. Đại khái giống như <B>cụ LữLiên</B> 
      trước đây <B>Hát</B> nhạc hài hước, bây giờ <B>cô KhánhHà</B> thừa kế từ 
      cụ nhưng override <B>Method Hát</B> của cụ và cô implement một <B>Method 
      Hát</B> mới dùng cho nhạc trử tình.<BR><BR>Lúc runtime, nếu một Object 
      không có implementation của một Method thì CLR (Common Language Runtime) 
      sẽ dùng Method của Parent Class của nó. Trong thí dụ trên vì cô KhánhHà có 
      một implementation cho method Hát nên system sẽ dùng method đó, thay vì 
      dùng method Hát của cụ LữLiên. </FONT></P></LI></OL>
    <H3 align=justify><FONT color=green size=2>Dùng OO trong VB.NET</FONT></H3>
    <H3 align=justify><FONT color=blue size=2>Tạo một Class mới</FONT></H3>
    <P align=justify><FONT size=2>Bạn tạo một Class mới trong VB.NET IDE bằng 
    cách dùng Menu Command <B>Project | Add Class</B>. Dialog <B>Add New 
    Item</B> sẽ hiện ra, chọn <B>Class</B> trong số hình các Icons nằm trong 
    khung bên phải của Dialog.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=399 src="4_files/AddClass.gif" 
      width=531></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Source code của Class mới nầy sẽ được chứa 
    trong một VB source file với extension <B>vb</B>. Trong VB.NET tất cả mọi VB 
    source files đều có extension <B>.vb</B>. System sẽ nhận diện ra loại VB 
    file (form, class, module,.v.v..) nhờ đọc content của file, chớ không dựa 
    vào file extension.<BR><BR>Nếu bạn muốn đặt tên cho Class mới nầy là 
    TheClass chẳng hạn, thì bạn có thể sửa tên nó trong Dialog. Khi bạn click 
    button <B>Open</B> một file mới sẽ được cho thêm vào trong Project và nó 
    chứa hai hàng code sau:</FONT></P></FONT><FONT face=Tahoma>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Class</FONT> TheClass <BR>
<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE></FONT><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=justify><FONT face=Arial color=#ffffff size=2>Vovisoft © 
          2000. All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=justify><FONT face=Arial size=2>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->05 
          th3 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="13298" --> </FONT></P></TD>
        <TD width=181>
          <P align=justify><FONT face=Arial size=2></FONT>&nbsp;</P></TD>
        <TD width=258>
          <P align=justify><FONT face=Arial size=2><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE></BLOCKQUOTE></BLOCKQUOTE>
<HR>

<P align=center><FONT face="Times New Roman"><B><FONT color=#ff0000>PcLeHoan 
1996 - 2002</FONT><FONT face=.VnTime size=2><BR></FONT></B></FONT><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.pclehoan.com/andi/ndc.htm">http://www.pclehoan.com/andi/ndc.htm</A><BR><B>Mirror 
</B>: <A 
href="http://www.lehoanpc.net/andi/ndc.htm">http://www.lehoanpc.net/andi/ndc.htm</A></FONT><BR><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.ktlehoan.com/">http://www.ktlehoan.com/</A></FONT></P>
<P align=center><A target=_top 
href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?2828564"><IMG 
src="4_files/digits.gif" border=0></A> </P></BODY></HTML>
